디스크립터는 0-8(9개) 까지 사용가능하며,
default로 0, 1, 2에만 할당(open) 되어 있다.
출력 디스크립터 할당(open)
exec 3> fd3File.txt
exec 4>> fd4File.txt
echo "write on fd3" >&3
echo "write on fd4" >&4
exec 3>&1
exec 1>out.txt
exec 1>&3
입력 파일 디스크립터 할당(open)
exec 6<&0
exec 0< input.txt
exec 0<&6
출력/입력(읽기/쓰기)용 파일 디스크립터
파일 포인터는 읽기/쓰기 작업이 끝난 이후, 마지막 위치를 내부 포인터가 포인팅하고 있다.
따라서 포인터를 제대로 관리하지 않으면 기존 데이터를 덮어쓰게 되는 등의 문제가 생긴다.
파일 디스크립터 닫기&- 특수 기호로 리다이렉트 함으로서 해당 파일 디스크립터를 수동으로 닫을 수 있다.
파일 디스크립터를 닫고 난 이후,
동일한 출력 파일에 대해서 다시 파일 디스크립터를 생성한다고 해도
쉘은 기존 파일을 새 파일로 대체하게 된다.
(기존 파일을 덮어쓰게 될 수 있음)
파일 디스크립터 나열하기
lsof
lsof -p $$
lsof -d 0,1,2
lsof -a -p $$ -d 0,1,2
lsof는 시스템에서 실행되는 모든 파일 디스크립터의 목록을 보여준다.
(시스템 관리자가 아닌 리눅스 시스템에 대한 정보를 제공할 수 있기 때문에, 일부 리눅스 배포판(ex; 페도라)에서는
/usr/sbin/lsof 처럼 전체 경로를 참조해서 사용하도록 숨겨둔다.)
- COMMAND: 프로세스 안에 있는 명령 공정의 첫 아홉 글자
- PID: 프로세스 PID
- USER: 프로세스 소유한 사용자의 로그인 이름
- FD: 파일 디스크립터 번호 및 접근유형; r-(읽기), w-(쓰기), u-(읽기/쓰기)
- TYPE: 파일의 유형(CHR-캐릭터, BLK-블록, DIR-디렉토리, REG-일반파일)
- DEVICE: 장치의 번호(주번호, 부번호)
- SIZE: 가능한 경우에는 파일의 크기
- NODE: 로컬 파일의 노드 번호
- NAME: 파일의 이름
/dev/null아무것도 포함하지 않고 있는 device node /dev/null을 이용해서
출력값을 버리거나, 파일을 비우는 용도로 사용할 수 있다.
ls -al > /dev/null
cat /dev/null > wannaEmpty.txt
/dev/null을 입력 리다이렉트 하는 방법은 파일을 제거하고 다시 생성시키는 작업을 통해 파일을 비울 수 없는로그 파일과 같은 파일들의 내용을 비울 때 널리 사용된다.